/**
 * 创建人:  @author huangpeng    
 * 创建时间:  2022年09月25日 18:17
 * 项目名称:  lemon-blog-cloud
 * 文件名称:  BeanOptUtils
 * 文件描述:  @Description: 实体操作工具类
 * 公司名称:  柠檬
 *
 * All rights Reserved, Designed By 柠檬 
 * @Copyright: 2022-2022
 *
 */
package com.lemon.common.security.utils;

import com.lemon.common.core.constant.Constants;
import com.lemon.common.core.utils.DateUtils;
import com.lemon.common.core.utils.bean.BeanUtils;
import com.lemon.common.core.utils.primarykey.PrimaryKeyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * 包名称：com.lemon.blog.utils.bean
 * 类名称：BeanOptUtils
 * 类描述：实体操作工具类
 * 创建人：@author huangpeng
 * 创建时间：2022年09月25日 18:17
 */
public class OptEntityUtils {

    public static final Logger logger = LoggerFactory.getLogger(OptEntityUtils.class);

    /**
     * 实体插入前，公共参数预处理
     * @Title: preInsert
     * @Description: 实体插入前，公共属性预处理
     * @param t 实体
     * @return: T
     * @throws:
     * @author: huangpeng
     * @Date: 2022/9/25 22:01
     */
    public static <T> T preInsert(T t) {
        String loginUserName = SecurityUtils.getUsername();
        Date date = DateUtils.getNowDate();
        try {
            if (BeanUtils.isExistField("id", t)) {
                Method idMd = t.getClass().getMethod("setId", Long.class);
                idMd.invoke(t, PrimaryKeyUtils.generateId());
            }
            if (BeanUtils.isExistField("delFlag", t)) {
                Method delFlagMethod = t.getClass().getMethod("setDelFlag", String.class);
                delFlagMethod.invoke(t, Constants.DEL_FLAG_NO);
            }
            if (BeanUtils.isExistField("createBy", t)) {
                Method createByMethod = t.getClass().getMethod("setCreateBy", String.class);
                createByMethod.invoke(t, loginUserName);
            }
            if (BeanUtils.isExistField("createTime", t)) {
                Method createTimeMethod = t.getClass().getMethod("setCreateTime", Date.class);
                createTimeMethod.invoke(t, date);
            }
            if (BeanUtils.isExistField("updateBy", t)) {
                Method updateByMethod = t.getClass().getMethod("setUpdateBy", String.class);
                updateByMethod.invoke(t, loginUserName);
            }
            if (BeanUtils.isExistField("updateTime", t)) {
                Method updateTimeMethod = t.getClass().getMethod("setUpdateTime", Date.class);
                updateTimeMethod.invoke(t, date);
            }
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return t;
    }

    /**
     * 实体更新前，公共属性预处理
     * @Title: preUpdate
     * @Description: 实体更新前，公共属性预处理
     * @param t 实体
     * @return: T
     * @throws:
     * @author: huangpeng
     * @Date: 2022/9/25 22:08
     */
    public static <T> T preUpdate(T t) {
        String loginUserName = SecurityUtils.getUsername();
        Date date = DateUtils.getNowDate();
        try {
            if (BeanUtils.isExistField("updateBy", t)) {
                Method updateByMethod = t.getClass().getMethod("setUpdateBy", String.class);
                updateByMethod.invoke(t, loginUserName);
            }
            if (BeanUtils.isExistField("updateTime", t)) {
                Method updateTimeMethod = t.getClass().getMethod("setUpdateTime", Date.class);
                updateTimeMethod.invoke(t, date);
            }
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return t;
    }

}
